import { Text } from 'leafer-ui'

/**
 * 一个坐标点
 */
export interface IPoint {
    x: number
    y: number
}

/**
 * 拥有中点的对象
 */
export interface IHasCenterObj {
    width: number
    height: number
    x: number
    y: number
    center?: {
        default?: IPoint
        left?: IPoint
        right?: IPoint
        top?: IPoint
        bottom?: IPoint
    }
}
/**
 * 模块名称key类型
 */
export type ModuleKeyType =
    | 'container'
    | 'conSignal'
    | 'sm'
    | 'decoder'
    | 'ir'
    | 'ram'
    | 'au'
    | 'psw'
    | 'multiplexer31'
    | 'pc'
    | 'reg'
    | 'multiplexer21'
    | `bus${string}`
    | 'bus'
    | 'input'
    | 'output'
    | 'multiplexer31RAI'
    | 'savesig'
    | 'changeToBCD'
    | 'segment'
    | 'sevenSegment'
    | 'shumaguan'

/**
 * 模块对象
 */
export interface IModule {
    /**
     * 模块名称
     */
    name: ModuleKeyType
    /**
     * 初始化函数
     */
    init: () => void
    /**
     * 当状态发生变化时执行的函数
     */
    change?: () => Promise<void | void[]>
    /**
     * 下降沿时执行的函数
     */
    neg?: () => Promise<void | void[]>
    /**
     * 上升沿时执行的函数
     */
    rise?: () => Promise<void | void[]>
}

/**
 * 含有状态的模块
 */
export interface IModuleWithState<K> extends IModule {
    /**
     * 模块状态
     */
    state: K
    /**
     * 设置模块状态的函数
     */
    setState: SetStateFunc<K>
    [key: string]: any
}

/**
 * 边沿key类型
 */
export type EdgeKeyType = 'low' | 'rise' | 'high' | 'neg'

/**
 * 布尔值类型
 */
export type BoolType = 0 | 1 | number

/**
 * 模块状态设置函数
 */
export type SetStateFunc<K> = <T extends keyof K>(
    /**
     * 要修改的属性
     */
    prop: T,
    /**
     * 该属性的新值
     */
    value: K[T],
    /**
     * 是谁修改的该属性，非必传，一般用不到
     */
    from?: string
) => Promise<void>

/**
 * 一个数据值，包含值和dom，dom会显示在页面的bus容器中
 */
export interface IDataValue<T extends number | string> {
    value: T
    dom: Text
    setPosition: (point: IPoint) => void
    setText: (text: string) => void
}
